//  工具类封装
import * as XLSX from 'xlsx'
import axios from 'axios'

// 导入 excel 处理函数
const readFile = (file: any) => {
  return new Promise((resolve) => {
    const reader = new FileReader()
    // readAsBinaryString 方法已启用，使用 readAsArrayBuffer 代替
    reader.readAsArrayBuffer(file)
    reader.onload = (ev: any) => {
      resolve(ev.target.result)
    }
  })
}
// 导入 excel
/**
 *
 * @param file excel文件
 * @returns 解析后的数据
 */
const importExcel = async (file: any) => {
  const dataArray = await readFile(file)
  const workBook = XLSX.read(dataArray, { type: 'array', cellDates: true })
  const workSheet = workBook.Sheets[workBook.SheetNames[0]]
  const data = XLSX.utils.sheet_to_json(workSheet)
  return data
}

// 导出 excel
type exportType = {
  data: any[]
  header: (string | number)[]
  title: string
}
/**
 *
 * @param data  数据源(required)
 * @param header 标题行
 * @param title  导出的excel标题
 */
const exportExcel = (
  data: exportType['data'],
  header?: exportType['header'],
  title: exportType['title'] = '数据导出',
) => {
  const XLSXData: any = data
  const ws = XLSX.utils.aoa_to_sheet([header, ...XLSXData])
  const wb = XLSX.utils.book_new()
  // 设置合并的单元格
  // let last = 1
  // let mergerarr = [
  //     { s: { r: last, c: 0 }, e: { r: last, c: 2 } },   // (last,0) (last,2) 单元格合并
  //     { s: { r: last, c: 3 }, e: { r: last, c: 4 } },
  //     { s: { r: last, c: 5 }, e: { r: last, c: 8 } },
  //     { s: { r: last, c: 9 }, e: { r: last, c: 11 } },
  //     { s: { r: last, c: 12 }, e: { r: last, c: 14 } },
  // ];
  // ws['!merges'] = mergerarr;

  //设置列宽
  ws['!cols'] = []
  for (let i = 0; i < 50; i++) {
    if (i === 4) {
      ws['!cols'].push({
        wpx: 350,
      })
    } else if (i === 1) {
      ws['!cols'].push({
        wpx: 100,
      })
    } else {
      ws['!cols'].push({
        wpx: 80,
      })
    }
  }
  XLSX.utils.book_append_sheet(wb, ws, 'sheet')
  XLSX.writeFile(wb, title + '.xlsx')
}

/**
 * 导出多个 sheet 例子，根据实际情况修改
 * @param data 数据
 * @param header 标题行
 * @param title 标题
 */
const exportMultipleSheets = (
  header: exportType['header'],
  data: exportType['data'],
  title: exportType['title'] = '数据导出',
) => {
  const arr1: any = []
  const arr2: any = []
  data.forEach((el) => {
    if (el[4] == 1) {
      arr1.push(el)
    } else {
      arr2.push(el)
    }
  })
  // 创建工作簿
  const workbook = XLSX.utils.book_new()

  // 创建第一个 sheet 的数据
  const sheet1Data = [header, ...arr1]

  // 创建第一个 sheet
  const worksheet1 = XLSX.utils.aoa_to_sheet(sheet1Data)
  XLSX.utils.book_append_sheet(workbook, worksheet1, '工位1数据')

  // 创建第二个 sheet 的数据
  const sheet2Data = [header, ...arr2]

  // 创建第二个 sheet
  const worksheet2 = XLSX.utils.aoa_to_sheet(sheet2Data)
  XLSX.utils.book_append_sheet(workbook, worksheet2, '工位2数据')

  // 生成 Excel 文件的 Blob 对象
  const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })

  // 创建一个 Blob 对象并触发下载
  const blob = new Blob([wbout], { type: 'application/octet-stream' })
  const url = window.URL.createObjectURL(blob)
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', title + '.xlsx')
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}

// 存储函数
/**
 *
 * @param name 存储的名称
 * @param data 存储的数据
 * @param type 默认 localStorage 存储，传入任意值开启 sessionStorage 存储
 */
const setLocalData = (name: string, data: any, type: string = 'local') => {
  const value = JSON.stringify(data)
  type == 'local'
    ? localStorage.setItem(name, value)
    : sessionStorage.setItem(name, value)
}
/**
 *
 * @param name 存储的名称
 * @returns 返回存储的数据
 * @param type 默认 localStorage 存储，传入任意值开启 sessionStorage 存储
 */
const getLocalData = (name: string, type: string = 'local') => {
  const item =
    type == 'local' ? localStorage.getItem(name) : sessionStorage.getItem(name)
  if (item) return JSON.parse(item)
}

/**
 * 自动计算适合展示该背景色的字体颜色
 * @param bgColor 颜色值
 * @returns 字体颜色
 */
const getContrastColor = (bgColor: string) => {
  // 将颜色字符串转换为 RGB 数组
  const rgb = bgColor.match(/^#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i)
  if (!rgb) {
    throw new Error('Invalid color format')
  }

  // 将十六进制值转换为十进制
  const r = parseInt(rgb[1], 16)
  const g = parseInt(rgb[2], 16)
  const b = parseInt(rgb[3], 16)

  // 计算亮度（RGB 的平均值）
  const brightness = (r + g + b) / 3

  // 根据亮度选择字体颜色
  return brightness > 128 ? '#000000' : '#FFFFFF'
}

/**
 * 文件下载
 * @param downloadUrl  请求地址
 * @param params 参数
 */
const downloadFile = async (downloadUrl: string, params: object) => {
  try {
    const response = await axios({
      method: 'get',
      url: downloadUrl,
      responseType: 'blob', // 这一点很重要！
      params: params,
    })
    const blob = new Blob([response.data], {
      type: response.headers['content-type'],
    })
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.href = url
    link.setAttribute('download', '') // 设置下载的文件名，空字符串代表使用服务器响应中的文件名
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(url) // 清理 URL 对象
  } catch (error) {
    console.error('文件下载失败:', error)
  }
}

export {
  importExcel,
  exportExcel,
  exportMultipleSheets,
  setLocalData,
  getLocalData,
  getContrastColor,
  downloadFile,
}
